
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
    <meta name="description" content="awk:文本和数据进行处理的编程语言 - 最专业的Linux命令大全，内容包含Linux命令手册、详解、学习，值得收藏的Linux命令速查手册。">
    <meta name="keywords" content="Linux,Command,命令大全,Linux命令手册,awk,文本和数据进行处理的编程语言">
    <title>awk 命令，Linux awk 命令详解：文本和数据进行处理的编程语言 -  Linux 命令搜索引擎</title>
    <link rel="shortcut icon" href="../img/favicon.ico">
    <link rel="stylesheet" type="text/css" href="../css/index.css?v=1559033627835">
</head>
<body>
<a href="https://github.com/jaywcjlove/linux-command" target="_blank" class="github-corner"> <svg viewBox="0 0 250 250"><!-- kenny wang <wowohoo@qq.com> https://github.com/jaywcjlove --> <title>logo</title> <desc>Linux Command Logo. https://github.com/jaywcjlove</desc><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg> </a>
<div class="header header_list">
    <div class="logo">
        <a href="/">
        <svg width="183px" height="48px" viewBox="0 0 183 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- kenny wang <wowohoo@qq.com> https://github.com/jaywcjlove --> <title>logo</title> <desc>Linux Command Logo. https://github.com/jaywcjlove</desc><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Desktop-HD" transform="translate(-576.000000, -261.000000)" fill="#4A4A4A"> <g id="logo" transform="translate(576.000000, 261.000000)"> <path d="M20.4917792,0.000336524232 C20.1886146,-0.000100520225 19.8723998,0.0124863601 19.542641,0.0387964365 C11.2083649,0.710004944 13.4186692,9.51473754 13.2949769,12.4631618 C13.1427718,14.6193207 12.7056049,16.3185233 11.2226825,18.426428 C9.48047033,20.4982285 7.02763261,23.8514609 5.86566251,27.3420607 C5.3172635,28.9894735 5.05630425,30.6686289 5.29730805,32.2578406 C5.22181299,32.325447 5.14994103,32.3962788 5.08160039,32.469239 C4.57008792,33.0153217 4.19213625,33.6769851 3.77100458,34.1224689 C3.37755968,34.5149436 2.81698897,34.6642292 2.20097918,34.8852382 C1.58472464,35.1063477 0.908127379,35.4323261 0.497432332,36.2204265 C0.497432332,36.2204265 0.497432332,36.2207368 0.49712203,36.2207368 C0.496684986,36.222048 0.495373852,36.2233591 0.494936808,36.2246702 L0.494936808,36.2246702 C0.123151829,36.919077 0.233680372,37.718746 0.347224522,38.4596325 C0.460773043,39.2004972 0.575720105,39.9005856 0.423139144,40.3755699 C-0.0645762474,41.7086473 -0.126850712,42.6307542 0.216491414,43.2996202 C0.560563403,43.9698759 1.2680029,44.2657113 2.06756262,44.432706 C3.66668644,44.7666954 5.83232039,44.6837094 7.53908826,45.5883128 L7.68579097,45.3115063 L7.54060917,45.5891344 C9.36778716,46.5444437 11.2201913,46.8837519 12.698079,46.5461831 C13.7695766,46.3014513 14.6393781,45.6634363 15.0860725,44.6816946 C16.2420201,44.6760567 17.5104717,44.1864315 19.5423657,44.0745568 C20.9208039,43.9635213 22.6427241,44.564051 24.6233484,44.4540775 C24.6751207,44.6689591 24.750052,44.8756375 24.8526175,45.0720452 C24.8539287,45.0742305 24.8548028,45.0759786 24.8556769,45.0780328 C25.6234722,46.6133699 27.0500902,47.3156173 28.570428,47.1956355 C30.0927718,47.075492 31.711331,46.1778551 33.0196848,44.6208231 L32.7798304,44.4192582 L33.0215204,44.618616 C34.2685787,43.1065034 36.3384911,42.4794975 37.7110118,41.6516741 C38.3972721,41.2377581 38.9541192,40.7194802 38.9971462,39.966706 C39.0401514,39.2142991 38.5984218,38.3711223 37.5826868,37.2436088 L37.5823765,37.2432985 C37.5820662,37.2428614 37.5815024,37.2424244 37.5810654,37.2415503 C37.2473295,36.8644028 37.0881185,36.1654026 36.91702,35.4210285 C36.7460395,34.6771089 36.5551865,33.8746254 35.9444344,33.3545687 L35.9444344,33.3545687 C35.9431233,33.3532575 35.9418121,33.3523835 35.940938,33.3515094 L35.940938,33.3515094 C35.6978714,33.1397045 35.4452772,32.9959518 35.1909042,32.8993694 C36.0400422,30.3810493 35.7068789,27.8734149 34.8497254,25.6073831 C33.7977638,22.8263338 31.9611937,20.4030752 30.5585738,18.7453569 C28.9885703,16.7650385 27.4529665,14.8848863 27.4832187,12.1079627 C27.5299825,7.86977213 27.9494053,0.0101787654 20.4914689,0 L20.4917792,0.000336524232 Z M21.5014393,6.5296802 C21.9246338,6.5296802 22.2860696,6.65372652 22.6573476,6.92320377 C23.0345213,7.1969553 23.3062494,7.53965497 23.5252523,8.01821865 C23.7401952,8.48461502 23.843613,8.94086321 23.8537568,9.48229573 C23.8537568,9.49649968 23.8537568,9.50864951 23.8576902,9.52285346 C23.8616236,10.0784681 23.7664397,10.5509481 23.5555483,11.0335676 C23.4352081,11.3089536 23.2970146,11.540089 23.1316064,11.7401941 C23.0754506,11.7132285 23.0171357,11.6873118 22.9566488,11.6624396 L22.9566488,11.6624396 C22.5373789,11.4828667 22.2157491,11.3685884 21.9476879,11.2755722 C22.044856,11.158772 22.1257661,11.0202464 22.1969169,10.8470719 C22.3043949,10.5854877 22.3571155,10.3299784 22.367255,10.025813 C22.367255,10.0136631 22.3711884,10.00348 22.3711884,9.98931975 C22.3772633,9.69732161 22.3387597,9.44789596 22.2535753,9.19239103 C22.1643483,8.92472316 22.0507955,8.73208707 21.886541,8.57188842 C21.722291,8.41168541 21.5580366,8.33869024 21.361336,8.33260221 C21.3521143,8.33216517 21.3429364,8.33216517 21.3338459,8.33216517 C21.1488275,8.33260221 20.9881699,8.39616596 20.8219532,8.53532529 C20.6475593,8.6813331 20.5177834,8.86788115 20.4103054,9.12744186 C20.3028318,9.38699819 20.2501067,9.64452664 20.239976,9.95073309 C20.2377908,9.96288293 20.2377908,9.97306607 20.2377908,9.9852159 C20.2342945,10.1535261 20.2449584,10.307711 20.2709188,10.4574381 C19.8923378,10.2687966 19.535574,10.1401875 19.2007499,10.0604924 C19.181651,9.91570835 19.1706375,9.76629596 19.1670975,9.61007442 L19.1670975,9.56750629 C19.1610225,9.01391519 19.2522643,8.53941165 19.4651836,8.05679657 C19.6781029,7.57417712 19.9417194,7.2274173 20.3128051,6.94555422 C20.6838952,6.66369114 21.0488973,6.53391079 21.4808239,6.52985938 L21.5010154,6.52985938 L21.5014393,6.5296802 Z M15.7091362,6.98827969 C15.9898804,6.98871673 16.2410892,7.0827381 16.5009296,7.29023807 C16.7828014,7.51531597 16.9957164,7.80326271 17.1741616,8.20882685 C17.3526112,8.614391 17.4479175,9.01995077 17.4742757,9.49851445 L17.4742757,9.50244785 C17.4870374,9.70344023 17.485464,9.89263677 17.469643,10.0758677 C17.4141165,10.091645 17.3597045,10.1087334 17.3064069,10.1270762 C17.0036968,10.2312719 16.7369205,10.373272 16.5044085,10.5268101 C16.5271785,10.366205 16.5305437,10.2032486 16.5131057,10.0215605 C16.5109204,10.0114211 16.5109204,10.0032921 16.5109204,9.99319633 C16.4865771,9.75189098 16.435893,9.54911109 16.3507218,9.34429895 C16.2594713,9.131384 16.1580813,8.98132478 16.0242452,8.86573527 C15.9029566,8.76098882 15.7883592,8.71289208 15.6622806,8.71384046 C15.6492567,8.71384046 15.636058,8.71427751 15.6227281,8.71558864 C15.4807804,8.72773848 15.3631674,8.79669098 15.251638,8.93255936 C15.1401086,9.068419 15.0671091,9.23672919 15.0143884,9.4597792 C14.9616634,9.68284232 14.9474682,9.90184967 14.9697706,10.1532945 C14.9697706,10.1634339 14.9719558,10.1715629 14.9719558,10.1816586 C14.9962992,10.4249963 15.0449553,10.6277718 15.1321501,10.8325883 C15.2213771,11.0434797 15.3247905,11.1935346 15.4586266,11.3091153 C15.481047,11.3284764 15.5032139,11.3458708 15.525289,11.361399 C15.3860816,11.468536 15.3196072,11.5179308 15.2055298,11.6017559 C15.1323642,11.6554425 15.0452263,11.7193646 14.94395,11.7940162 C14.7230765,11.5871106 14.5507673,11.3270648 14.4001137,10.984671 C14.2216641,10.5791112 14.1263578,10.1735471 14.0979674,9.69498342 L14.0979674,9.69105002 C14.0716136,9.21249508 14.1182463,8.8008429 14.2500545,8.37500864 C14.3818627,7.94916563 14.5582845,7.6409444 14.813785,7.38745861 C15.06929,7.13399031 15.3268184,7.00623784 15.6370763,6.99001912 C15.6613322,6.98870799 15.6853347,6.98827095 15.709123,6.98827095 L15.7091362,6.98827969 Z M18.3434478,10.3083666 C18.9959552,10.3057443 19.7811624,10.5197693 20.731756,11.1309629 C21.3156605,11.5106715 21.7700031,11.5424053 22.8162176,11.9904939 L22.8175288,11.9909309 L22.8188399,11.991368 C23.322219,12.1979021 23.6176741,12.4671083 23.7620255,12.7505841 C23.906377,13.034073 23.9099039,13.3414857 23.7890786,13.6648724 C23.5474411,14.3116676 22.7761407,14.9923468 21.6937826,15.3303395 L21.6929085,15.3307766 L21.6920344,15.3312136 C21.1642857,15.5026793 20.7040867,15.8813302 20.1615484,16.1915706 C19.6190277,16.5017979 19.00512,16.7520102 18.1703739,16.7037212 C18.1703739,16.7037168 18.1703739,16.7037212 18.1703739,16.7037212 C17.4597396,16.6622893 17.0349499,16.4210539 16.650849,16.1123607 C16.2667437,15.8036631 15.9320245,15.4158517 15.4418966,15.1280491 L15.4405854,15.1271751 L15.4392743,15.126301 C14.6497885,14.6800742 14.2187709,14.163964 14.0834969,13.7165354 C13.9482185,13.2691068 14.075193,12.8871911 14.4668766,12.5936327 C14.9072645,12.2635986 15.2131825,12.0390976 15.4169632,11.8895453 C15.6194022,11.7409983 15.703625,11.685297 15.7680935,11.623394 C15.7684038,11.622957 15.7685305,11.622957 15.7689675,11.6225199 L15.7692735,11.6220829 C16.1001729,11.3088706 16.6276463,10.738226 17.4227569,10.4645313 C17.696421,10.3703264 18.001784,10.3095466 18.3435746,10.3081961 L18.3434478,10.3083666 Z M22.9062619,13.0069369 C22.6246829,13.0237631 22.3297828,13.1687002 21.9864013,13.3604054 C21.6430199,13.5521105 21.256878,13.7973406 20.8384079,14.0388338 C20.0014721,14.5218204 19.038047,14.9837283 18.0805918,14.9837283 C17.1216551,14.9837283 16.3555118,14.5408493 15.7808726,14.0854752 C15.4935509,13.8577838 15.2564149,13.6284404 15.0669561,13.4510265 C14.9722311,13.3623109 14.8900799,13.2867065 14.8134179,13.2276487 C14.7367734,13.1685909 14.6743853,13.1100357 14.5461303,13.1100357 L14.5400116,13.3795435 C14.5308337,13.4697233 14.5213935,13.4669437 14.5251084,13.4693999 C14.5310959,13.4733333 14.5608587,13.4835601 14.5955731,13.5103509 C14.6519344,13.5537495 14.7301609,13.6245375 14.8230067,13.7114832 C15.0086981,13.8853788 15.2554403,14.124464 15.5592255,14.3652012 C16.166796,14.8466668 17.0117515,15.3406363 18.0806093,15.3406363 C19.1509618,15.3406363 20.1636375,14.8403471 21.016875,14.3479598 C21.4434872,14.1017639 21.8309534,13.8560094 22.1604324,13.6720705 C22.4898897,13.4881185 22.7670895,13.3727781 22.9275766,13.3632068 L22.9062925,13.00695 L22.9062619,13.0069369 Z M23.8576858,14.2878093 C24.5685911,17.0901733 26.2220701,21.1378562 27.2848005,23.113201 C27.8496849,24.1612205 28.9735097,26.3878921 29.4590574,29.0706371 C29.7667148,29.0611969 30.1054855,29.1059065 30.4682673,29.1987042 C31.7377591,25.907589 29.3917525,22.3626165 28.3189832,21.375368 C27.8858722,20.9551061 27.8650557,20.7668098 28.0797669,20.7757081 C29.2436775,21.8049915 30.7716374,23.8752142 31.3275492,26.211938 C31.581035,27.2774436 31.6350799,28.3975886 31.3630809,29.5030663 C31.4961478,29.5583437 31.6312951,29.6184504 31.7682604,29.683286 C33.806037,30.6755779 34.5596721,31.5384567 34.1973186,32.716121 C34.0779748,32.7117506 33.960576,32.7126247 33.8460659,32.7152469 C33.8354021,32.7155572 33.8247819,32.715684 33.814118,32.716121 C34.1092104,31.7826203 33.4554837,31.0941179 31.7135031,30.305952 C29.9067264,29.5110511 28.4669839,29.5901387 28.2236507,31.2022427 C28.2080919,31.2867016 28.1955487,31.3727644 28.1860212,31.460029 C28.05104,31.506902 27.9153158,31.5667509 27.7792552,31.6412014 C26.9308557,32.1054213 26.4677896,32.9477371 26.2102393,33.9808403 C25.9529032,35.0131131 25.8791213,36.2610673 25.8081016,37.6639101 L25.8081016,37.6647842 C25.7647031,38.3701826 25.4746935,39.3242507 25.1805582,40.3347805 C22.2207839,42.446033 18.1128938,43.3607409 14.6251435,40.9805006 C14.3887768,40.6065916 14.1176344,40.2361221 13.8385378,39.8707355 C13.6603154,39.6373843 13.4772332,39.4054841 13.2952172,39.1768225 C13.6532528,39.1768225 13.9575843,39.1184771 14.2035442,39.0069433 C14.5094142,38.8682516 14.724322,38.6454901 14.8306462,38.3594969 C15.0432858,37.7875325 14.8297721,36.9806654 14.1489836,36.0592664 C13.4682956,35.137933 12.3154554,34.0981212 10.6214273,33.0592009 C10.6214273,33.0592009 10.621117,33.0592009 10.621117,33.0588906 C9.37658486,32.2846183 8.68057408,31.3355981 8.3547924,30.3051959 C8.02898013,29.2747018 8.07466439,28.1604089 8.32577265,27.0602631 C8.80774091,24.9485692 10.0461107,22.8947793 10.8362565,21.605909 C11.0489879,21.4493815 10.9122629,21.8964561 10.0363515,23.5230089 C9.25134103,25.0101357 7.78376323,28.4420972 9.79314068,31.1210705 C9.84684033,29.2145776 10.3021401,27.2701931 11.0664741,25.45145 C12.1797968,22.9278068 14.5084483,18.5514927 14.6933968,15.0635108 C14.7887555,15.1327561 15.1164383,15.3538525 15.2624505,15.4368866 C15.2627608,15.4373237 15.2628875,15.4373237 15.2633246,15.4373237 C15.6905181,15.6888908 16.0113611,16.0566244 16.426903,16.3905832 C16.8432709,16.7252019 17.3634237,17.0142238 18.149269,17.0600129 L18.149269,17.0600129 C19.066516,17.113092 19.7655905,16.8289912 20.3383504,16.5014745 C20.9102449,16.1744603 21.3671137,15.8125482 21.7999582,15.6712779 C21.8003952,15.6708409 21.8012693,15.6708409 21.8017063,15.6708409 C22.7163355,15.3848215 23.44356,14.8785842 23.857393,14.2881327 L23.8576858,14.2878093 Z M29.6669682,30.3312962 C30.0374289,30.329548 30.4861993,30.4530917 30.9774372,30.6728508 C32.2995623,31.2832227 32.713238,31.8063999 32.3522873,32.5749338 C32.0481219,33.1548918 30.7462669,34.0775407 29.8540319,33.8342075 C28.9435503,33.5989814 28.4994564,32.2869871 28.6474877,31.2953987 C28.7267763,30.6220356 29.1076387,30.3339097 29.6669682,30.3312962 L29.6669682,30.3312962 Z M28.1710786,32.1433306 C28.2458176,33.3559191 28.8457529,34.5926195 29.9067526,34.8602742 C31.0678224,35.1661922 32.7418469,34.16998 33.4486352,33.3574182 C33.5895689,33.3517803 33.7273516,33.3448313 33.8611658,33.3416409 C34.4811527,33.3266503 35.001157,33.3620509 35.5324588,33.8267253 L35.534207,33.8284735 L35.5359552,33.8302216 C35.9442465,34.1761336 36.1383204,34.8298385 36.3066481,35.5621545 C36.4749627,36.294475 36.6095636,37.0920505 37.11435,37.6602345 L37.115224,37.6611086 L37.1156611,37.6619827 C38.0861227,38.7388952 38.3980544,39.4668146 38.3715083,39.931406 C38.344936,40.3960279 38.008556,40.7409347 37.3873891,41.1155867 C36.1455928,41.864576 33.9453056,42.5158727 32.5399192,44.2181871 C31.3196037,45.6704378 29.8315635,46.4680352 28.5210638,46.5714617 C27.2105642,46.6748883 26.0799127,46.1309646 25.4133237,44.793071 L25.4115756,44.7900117 L25.4098274,44.7869524 C24.9962959,44.0002986 25.1685614,42.758852 25.5169207,41.4493706 C25.8652845,40.1398937 26.3657922,38.7953264 26.4327911,37.7024923 L26.4327911,37.7007442 L26.4327911,37.698996 C26.5036666,36.2987755 26.5820418,35.0759688 26.8172504,34.1324728 C27.0524633,33.1889769 27.4228236,32.5499829 28.0790545,32.1909116 C28.109604,32.1742165 28.139948,32.1584392 28.1701128,32.1435097 L28.1710786,32.1433306 Z M6.86074718,32.2348346 C6.95869322,32.2351449 7.06234705,32.2434006 7.17277507,32.2601394 C7.91559769,32.3726653 8.5633675,32.8920358 9.18746261,33.7385341 C9.8115621,34.5850455 10.3922762,35.7405823 10.9892352,37.0223812 L10.9901093,37.0241294 L10.9905463,37.0258776 C11.4702594,38.0271115 12.4825418,39.128044 13.3403902,40.2511564 C14.1982341,41.3742689 14.8621527,42.5016163 14.7756966,43.3644732 L14.7753863,43.3684066 L14.775076,43.37234 C14.6632363,44.843978 13.8330966,45.6451198 12.5587449,45.9361914 C11.2847734,46.2271625 9.55771794,45.9379396 7.83269472,45.035587 L7.83094655,45.035587 C5.9224477,44.0247687 3.65205856,44.1251622 2.19566909,43.8209924 C1.46727769,43.6688572 0.99200058,43.44013 0.773862951,43.0151698 C0.55571221,42.5902315 0.550839164,41.8488511 1.01440785,40.5847437 L1.01659307,40.5791059 L1.01834125,40.573468 C1.24759292,39.8663213 1.07793226,39.0925822 0.96663015,38.3663367 C0.855328038,37.6400911 0.800894151,36.9795116 1.04888192,36.5190765 L1.05019305,36.5168913 L1.05150418,36.514706 C1.36900824,35.9026821 1.83472718,35.683902 2.41273159,35.4765375 C2.990736,35.2691556 3.67612223,35.1062953 4.21734934,34.5638925 L4.21997161,34.5612703 L4.22259387,34.558648 C4.72293985,34.0308163 5.09877623,33.3691834 5.53863963,32.8995879 C5.90977341,32.5033678 6.28118253,32.2407652 6.84099715,32.2368755 L6.86053303,32.2368755 L6.86074718,32.2348346 Z" id="path4004"></path> <path d="M58.5014648,40 L58.5014648,6.7578125 L65.4194336,6.7578125 L65.4194336,35.2832031 L80.4008789,35.2832031 L80.4008789,40 L58.5014648,40 L58.5014648,40 L58.5014648,40 Z M86.2524414,40 L86.2524414,15.3378906 L92.9008789,15.3378906 L92.9008789,40 L86.2524414,40 L86.2524414,40 L86.2524414,40 Z M86.2524414,11.1826172 L86.2524414,5.63476562 L92.9008789,5.63476562 L92.9008789,11.1826172 L86.2524414,11.1826172 L86.2524414,11.1826172 L86.2524414,11.1826172 Z M100.211426,40 L100.211426,15.3378906 L106.859863,15.3378906 L106.859863,19.9873047 C109.031098,16.513329 111.8312,14.7763672 115.260254,14.7763672 C117.461437,14.7763672 119.198399,15.4726493 120.471191,16.8652344 C121.743984,18.2578195 122.380371,20.1594932 122.380371,22.5703125 L122.380371,40 L115.731934,40 L115.731934,24.2099609 C115.731934,21.4098167 114.803557,20.0097656 112.946777,20.0097656 C110.835439,20.0097656 108.806488,21.4996596 106.859863,24.4794922 L106.859863,40 L100.211426,40 L100.211426,40 L100.211426,40 Z M145.672363,40 L145.672363,35.3505859 C143.516102,38.8245616 140.716,40.5615234 137.271973,40.5615234 C135.07079,40.5615234 133.333828,39.8652413 132.061035,38.4726562 C130.788242,37.0800712 130.151855,35.1783975 130.151855,32.7675781 L130.151855,15.3378906 L136.800293,15.3378906 L136.800293,31.1279297 C136.800293,33.9280739 137.736156,35.328125 139.60791,35.328125 C141.704275,35.328125 143.725739,33.838231 145.672363,30.8583984 L145.672363,15.3378906 L152.320801,15.3378906 L152.320801,40 L145.672363,40 L145.672363,40 L145.672363,40 Z M158.003418,40 L166.471191,27.6240234 L158.362793,15.3378906 L165.932129,15.3378906 L171.23291,23.1542969 L176.309082,15.3378906 L181.699707,15.3378906 L173.973145,27.4443359 L182.26123,40 L174.691895,40 L169.166504,31.8466797 L163.506348,40 L158.003418,40 L158.003418,40 L158.003418,40 Z" id="Linux"></path> </g> </g> </g> </svg> 
        </a>
    </div>
    <div class="search">
        <ul class="search-list" id="result">
            <!-- <li><a href="#"><strong>find</strong> - 指定目录下查找文件。</a></li> -->
        </ul>
        <input type="text" class="query" id="query" autocomplete="off" autofocus="autofocus" placeholder="Linux 命令搜索"/>
        <div class="enter-input">
            <input type="hidden" id="current_path" value="F:\framework\linux-command\.deploy\c\awk.html">
            <button id="search_btn">搜索</button>
        </div>
    </div>
</div>

<div class="markdown-body">

<span class="edit_btn">
<a target="_blank" href="https://github.com/jaywcjlove/linux-command/edit/master/command/awk.md">纠正错误</a> 
<span class="split"></span>
<a target="_blank" href="https://github.com/jaywcjlove/linux-command/edit/master/command/awk.md">添加实例</a>
</span>

<h1 id="awk">awk</h1><p>文本和数据进行处理的编程语言</p>
<h2 id="补充说明">补充说明</h2><p><strong>awk</strong> 是一种编程语言，用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件，或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能，是linux/unix下的一个强大编程工具。它在命令行中使用，但更多是作为脚本来使用。awk有很多内建的功能，比如数组、函数等，这是它和C语言的相同之处，灵活性是awk最大的优势。</p>
<h2 id="awk命令格式和选项">awk命令格式和选项</h2><p><strong>语法形式</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token punctuation">[</span>options<span class="token punctuation">]</span> <span class="token string">'script'</span> var<span class="token operator">=</span>value file<span class="token punctuation">(</span>s<span class="token punctuation">)</span>
<span class="token function">awk</span> <span class="token punctuation">[</span>options<span class="token punctuation">]</span> -f scriptfile var<span class="token operator">=</span>value file<span class="token punctuation">(</span>s<span class="token punctuation">)</span></code></pre>
<p><strong>常用命令选项</strong> </p>
<ul>
<li><strong>-F fs</strong> fs指定输入分隔符，fs可以是字符串或正则表达式，如-F:</li>
<li><strong>-v var=value</strong> 赋值一个用户定义变量，将外部变量传递给awk</li>
<li><strong>-f scripfile</strong> 从脚本文件中读取awk命令</li>
<li><strong>-m[fr] val</strong> 对val值设置内在限制，-mf选项限制分配给val的最大块数目；-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能，在标准awk中不适用。</li>
</ul>
<h2 id="awk模式和操作">awk模式和操作</h2><p>awk脚本是由模式和操作组成的。</p>
<h3 id="模式">模式</h3><p>模式可以是以下任意一个：</p>
<ul>
<li>/正则表达式/：使用通配符的扩展集。</li>
<li>关系表达式：使用运算符进行操作，可以是字符串或数字的比较测试。</li>
<li>模式匹配表达式：用运算符<code>~</code>（匹配）和<code>!~</code>（不匹配）。</li>
<li>BEGIN语句块、pattern语句块、END语句块：参见awk的工作原理</li>
</ul>
<h3 id="操作">操作</h3><p>操作由一个或多个命令、函数、表达式组成，之间由换行符或分号隔开，并位于大括号内，主要部分是：</p>
<ul>
<li>变量或数组赋值</li>
<li>输出命令</li>
<li>内置函数</li>
<li>控制流语句</li>
</ul>
<h2 id="awk脚本基本结构">awk脚本基本结构</h2><pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ print "start" } pattern{ commands } END{ print "end" }'</span> <span class="token function">file</span></code></pre>
<p>一个awk脚本通常由：BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成，这三个部分是可选的。任意一个部分都可以不出现在脚本中，脚本通常是被 <strong>单引号</strong> 或 <strong>双引号</strong> 中，例如：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ i=0 } { i++ } END{ print i }'</span> filename
<span class="token function">awk</span> <span class="token string">"BEGIN{ i=0 } { i++ } END{ print i }"</span> filename</code></pre>
<h3 id="awk的工作原理">awk的工作原理</h3><pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ commands } pattern{ commands } END{ commands }'</span></code></pre>
<ul>
<li><p>第一步：执行<code>BEGIN{ commands }</code>语句块中的语句；</p>
</li>
<li><p>第二步：从文件或标准输入(stdin)读取一行，然后执行<code>pattern{ commands }</code>语句块，它逐行扫描文件，从第一行到最后一行重复这个过程，直到文件全部被读取完毕。</p>
</li>
<li><p>第三步：当读至输入流末尾时，执行<code>END{ commands }</code>语句块。</p>
<p><strong>BEGIN语句块</strong> 在awk开始从输入流中读取行 <strong>之前</strong> 被执行，这是一个可选的语句块，比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。</p>
<p><strong>END语句块</strong> 在awk从输入流中读取完所有的行 <strong>之后</strong> 即被执行，比如打印所有行的分析结果这类信息汇总都是在END语句块中完成，它也是一个可选语句块。</p>
<p><strong>pattern语句块</strong> 中的通用命令是最重要的部分，它也是可选的。如果没有提供pattern语句块，则默认执行<code>{ print }</code>，即打印每一个读取到的行，awk读取的每一行都会执行该语句块。</p>
<p><strong>示例</strong> </p>
</li>
</ul>
<pre><code class="language-shell"><span class="token keyword">echo</span> -e <span class="token string">"A line 1\nA line 2"</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'BEGIN{ print "Start" } { print } END{ print "End" }'</span>
Start
A line 1
A line 2
End</code></pre>
<p>当使用不带参数的<code>print</code>时，它就打印当前行，当<code>print</code>的参数是以逗号进行分隔时，打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用，例如：</p>
<pre><code class="language-shell"><span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'</span> 
v1 v2 v3</code></pre>
<p>双引号拼接使用：</p>
<pre><code class="language-shell"><span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'</span>
v1<span class="token operator">=</span>v2<span class="token operator">=</span>v3</code></pre>
<p>{ }类似一个循环体，会对文件中的每一行进行迭代，通常变量初始化语句（如：i=0）以及打印文件头部的语句放入BEGIN语句块中，将打印的结果等语句放在END语句块中。</p>
<h2 id="awk内置变量（预定义变量）">awk内置变量（预定义变量）</h2><p>说明：[A][N][P][G]表示第一个支持变量的工具，[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk</p>
<pre><code class="language-shell"> **<span class="token variable">&#36;n**</span>  当前记录的第n个字段，比如n为1表示第一个字段，n为2表示第二个字段。 
 **<span class="token variable">&#36;0**</span>  这个变量包含执行过程中当前行的文本内容。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **ARGC**  命令行参数的数目。
<span class="token punctuation">[</span>G<span class="token punctuation">]</span>  **ARGIND**  命令行中当前文件的位置（从0开始算）。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **ARGV**  包含命令行参数的数组。
<span class="token punctuation">[</span>G<span class="token punctuation">]</span>  **CONVFMT**  数字转换格式（默认值为%.6g）。
<span class="token punctuation">[</span>P<span class="token punctuation">]</span>  **ENVIRON**  环境变量关联数组。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **ERRNO**  最后一个系统错误的描述。
<span class="token punctuation">[</span>G<span class="token punctuation">]</span>  **FIELDWIDTHS**  字段宽度列表（用空格键分隔）。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **FILENAME**  当前输入文件的名。
<span class="token punctuation">[</span>P<span class="token punctuation">]</span>  **FNR**  同NR，但相对于当前文件。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **FS**  字段分隔符（默认是任何空格）。
<span class="token punctuation">[</span>G<span class="token punctuation">]</span>  **IGNORECASE**  如果为真，则进行忽略大小写的匹配。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **NF**  表示字段数，在执行过程中对应于当前的字段数。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **NR**  表示记录数，在执行过程中对应于当前的行号。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **OFMT**  数字的输出格式（默认值是%.6g）。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **OFS**  输出字段分隔符（默认值是一个空格）。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **ORS**  输出记录分隔符（默认值是一个换行符）。
<span class="token punctuation">[</span>A<span class="token punctuation">]</span>  **RS**  记录分隔符（默认是一个换行符）。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **RSTART**  由match函数所匹配的字符串的第一个位置。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **RLENGTH**  由match函数所匹配的字符串的长度。
<span class="token punctuation">[</span>N<span class="token punctuation">]</span>  **SUBSEP**  数组下标分隔符（默认值是34）。</code></pre>
<p><strong>示例</strong> </p>
<pre><code class="language-shell"><span class="token keyword">echo</span> -e <span class="token string">"line1 f2 f3\nline2 f4 f5\nline3 f6 f7"</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{print "Line No:"NR", No of fields:"NF, "<span class="token variable">&#36;0</span>="<span class="token variable">&#36;0</span>, "<span class="token variable">&#36;1</span>="<span class="token variable">&#36;1</span>, "<span class="token variable">&#36;2</span>="<span class="token variable">&#36;2</span>, "<span class="token variable">&#36;3</span>="<span class="token variable">&#36;3</span>}'</span> 
Line No:1, No of fields:3 <span class="token variable">&#36;0</span><span class="token operator">=</span>line1 f2 f3 <span class="token variable">&#36;1</span><span class="token operator">=</span>line1 <span class="token variable">&#36;2</span><span class="token operator">=</span>f2 <span class="token variable">&#36;3</span><span class="token operator">=</span>f3
Line No:2, No of fields:3 <span class="token variable">&#36;0</span><span class="token operator">=</span>line2 f4 f5 <span class="token variable">&#36;1</span><span class="token operator">=</span>line2 <span class="token variable">&#36;2</span><span class="token operator">=</span>f4 <span class="token variable">&#36;3</span><span class="token operator">=</span>f5
Line No:3, No of fields:3 <span class="token variable">&#36;0</span><span class="token operator">=</span>line3 f6 f7 <span class="token variable">&#36;1</span><span class="token operator">=</span>line3 <span class="token variable">&#36;2</span><span class="token operator">=</span>f6 <span class="token variable">&#36;3</span><span class="token operator">=</span>f7</code></pre>
<p>使用<code>print $NF</code>可以打印出一行中的最后一个字段，使用<code>$(NF-1)</code>则是打印倒数第二个字段，其他以此类推：</p>
<pre><code class="language-shell"><span class="token keyword">echo</span> -e <span class="token string">"line1 f2 f3n line2 f4 f5"</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{print <span class="token variable">&#36;NF</span>}'</span>
f3
f5</code></pre>
<pre><code class="language-shell"><span class="token keyword">echo</span> -e <span class="token string">"line1 f2 f3n line2 f4 f5"</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{print <span class="token variable"><span class="token variable">&#36;(</span>NF-1<span class="token variable">)</span></span>}'</span>
f2
f4
</code></pre>
<p>打印每一行的第二和第三个字段：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'{ print <span class="token variable">&#36;2</span>,<span class="token variable">&#36;3</span> }'</span> filename</code></pre>
<p>统计文件中的行数：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'END{ print NR }'</span> filename</code></pre>
<p>以上命令只使用了END语句块，在读入每一行的时，awk会将NR更新为对应的行号，当到达最后一行NR的值就是最后一行的行号，所以END语句块中的NR就是文件的行数。</p>
<p>一个每一行中第一个字段值累加的例子：</p>
<pre><code class="language-shell"><span class="token function">seq</span> 5 <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'BEGIN{ sum=0; print "总和：" } { print <span class="token variable">&#36;1</span>"+"; sum+=<span class="token variable">&#36;1</span> } END{ print "等于"; print sum }'</span> 
总和：
1+
2+
3+
4+
5+
等于
15</code></pre>
<h2 id="将外部变量值传递给awk">将外部变量值传递给awk</h2><p>借助 <strong><code>-v</code>选项</strong> ，可以将外部值（并非来自stdin）传递给awk：</p>
<pre><code class="language-shell">VAR<span class="token operator">=</span>10000
<span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> -v VARIABLE<span class="token operator">=</span><span class="token variable">&#36;VAR</span> <span class="token string">'{ print VARIABLE }'</span></code></pre>
<p>另一种传递外部变量方法：</p>
<pre><code class="language-shell">var1<span class="token operator">=</span><span class="token string">"aaa"</span>
var2<span class="token operator">=</span><span class="token string">"bbb"</span>
<span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{ print v1,v2 }'</span> v1<span class="token operator">=</span><span class="token variable">&#36;var1</span> v2<span class="token operator">=</span><span class="token variable">&#36;var2</span></code></pre>
<p>当输入来自于文件时使用：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'{ print v1,v2 }'</span> v1<span class="token operator">=</span><span class="token variable">&#36;var1</span> v2<span class="token operator">=</span><span class="token variable">&#36;var2</span> filename</code></pre>
<p>以上方法中，变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。</p>
<h2 id="查找进程pid">查找进程pid</h2><pre><code class="language-shell"><span class="token function">netstat</span> -antup <span class="token operator">|</span> <span class="token function">grep</span> 7770 <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{ print <span class="token variable">&#36;NF</span> NR}'</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{ print <span class="token variable">&#36;1</span>}'</span></code></pre>
<h2 id="awk运算与判断">awk运算与判断</h2><p>作为一种程序设计语言所应具有的特点之一，awk支持多种运算，这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数（如log、sqr、cos、sin等）和一些用于对字符串进行操作（运算）的函数（如length、substr等等）。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分，关系判断是每种程序设计语言都具备的功能，awk也不例外，awk中允许进行多种测试，作为样式匹配，还提供了模式匹配表达式<del>（匹配）和!</del>（不匹配）。作为对测试的一种扩充，awk也支持用逻辑运算符。</p>
<h3 id="算术运算符">算术运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>+ -</td>
<td>加，减</td>
</tr>
<tr>
<td>* / &amp;</td>
<td>乘，除与求余</td>
</tr>
<tr>
<td>+ - !</td>
<td>一元加，减和逻辑非</td>
</tr>
<tr>
<td>^ ***</td>
<td>求幂</td>
</tr>
<tr>
<td>++ --</td>
<td>增加或减少，作为前缀或后缀</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a="b";print a++,++a;}'</span>
0 2</code></pre>
<p>注意：所有用作算术运算符进行操作，操作数自动转为数值，所有非数值都变为0</p>
<h3 id="赋值运算符">赋值运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>= += -= <em>= /= %= ^= *</em>=</td>
<td>赋值语句</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell">a+<span class="token operator">=</span>5<span class="token punctuation">;</span> 等价于：a<span class="token operator">=</span>a+5<span class="token punctuation">;</span> 其它同类</code></pre>
<h3 id="逻辑运算符">逻辑运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td><code>||</code></td>
<td>逻辑或</td>
</tr>
<tr>
<td>&amp;&amp;</td>
<td>逻辑与</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a=1;b=2;print (a>5 &amp;&amp; b&lt;=2),(a>5 || b&lt;=2);}'</span>
0 1</code></pre>
<h3 id="正则运算符">正则运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>~ !~</td>
<td>匹配正则表达式和不匹配正则表达式</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'</span>
ok</code></pre>
<h3 id="关系运算符">关系运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>&lt; &lt;= &gt; &gt;= != ==</td>
<td>关系运算符</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a=11;if(a >= 9){print "ok";}}'</span>
ok</code></pre>
<p>注意：&gt; &lt; 可以作为字符串比较，也可以用作数值比较，关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较：按照ASCII码顺序比较。</p>
<h3 id="其它运算符">其它运算符</h3><table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>$</td>
<td>字段引用</td>
</tr>
<tr>
<td>空格</td>
<td>字符串连接符</td>
</tr>
<tr>
<td>?:</td>
<td>C条件表达式</td>
</tr>
<tr>
<td>in</td>
<td>数组中是否存在某键值</td>
</tr>
</tbody></table>
<p>例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a="b";print a=="b"?"ok":"err";}'</span>
ok</code></pre>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'</span>
0</code></pre>
<pre><code><span class="token function">awk</span> <span class="token string">'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'</span>
1</code></pre><h3 id="运算级优先级表">运算级优先级表</h3><p>!级别越高越优先<br>级别越高越优先</p>
<h2 id="awk高级输入输出">awk高级输入输出</h2><h3 id="读取下一条记录">读取下一条记录</h3><p>awk中<code>next</code>语句使用：在循环逐行匹配，如果遇到next，就会跳过当前行，直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并：</p>
<pre><code class="language-shell"><span class="token function">cat</span> text.txt
a
b
c
d
e

<span class="token function">awk</span> <span class="token string">'NR%2==1{next}{print NR,<span class="token variable">&#36;0</span>;}'</span> text.txt
2 b
4 d</code></pre>
<p>当记录行号除以2余1，就跳过当前行。下面的<code>print NR,$0</code>也不会执行。下一行开始，程序有开始判断<code>NR%2</code>值。这个时候记录行号是<code>：2</code> ，就会执行下面语句块：<code>&#39;print NR,$0&#39;</code></p>
<p>分析发现需要将包含有“web”行进行跳过，然后需要将内容与下面行合并为一行：</p>
<pre><code class="language-shell"><span class="token function">cat</span> text.txt
web01<span class="token punctuation">[</span>192.168.2.100<span class="token punctuation">]</span>
httpd            ok
tomcat               ok
<span class="token function">sendmail</span>               ok
web02<span class="token punctuation">[</span>192.168.2.101<span class="token punctuation">]</span>
httpd            ok
postfix               ok
web03<span class="token punctuation">[</span>192.168.2.102<span class="token punctuation">]</span>
mysqld            ok
httpd               ok
0
<span class="token function">awk</span> <span class="token string">'/^web/{T=<span class="token variable">&#36;0</span>;next;}{print T":t"<span class="token variable">&#36;0</span>;}'</span> test.txt
web01<span class="token punctuation">[</span>192.168.2.100<span class="token punctuation">]</span>:   httpd            ok
web01<span class="token punctuation">[</span>192.168.2.100<span class="token punctuation">]</span>:   tomcat               ok
web01<span class="token punctuation">[</span>192.168.2.100<span class="token punctuation">]</span>:   <span class="token function">sendmail</span>               ok
web02<span class="token punctuation">[</span>192.168.2.101<span class="token punctuation">]</span>:   httpd            ok
web02<span class="token punctuation">[</span>192.168.2.101<span class="token punctuation">]</span>:   postfix               ok
web03<span class="token punctuation">[</span>192.168.2.102<span class="token punctuation">]</span>:   mysqld            ok
web03<span class="token punctuation">[</span>192.168.2.102<span class="token punctuation">]</span>:   httpd               ok</code></pre>
<h3 id="简单地读取一条记录">简单地读取一条记录</h3><p><code>awk getline</code>用法：输出重定向需用到<code>getline函数</code>。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容，并给NF,NR和FNR等内建变量赋值。如果得到一条记录，getline函数返回1，如果到达文件的末尾就返回0，如果出现错误，例如打开文件失败，就返回-1。</p>
<p>getline语法：getline var，变量var包含了特定行的内容。</p>
<p>awk getline从整体上来说，用法说明：</p>
<ul>
<li><strong>当其左右无重定向符<code>|</code>或<code>&lt;</code>时：</strong> getline作用于当前文件，读入当前文件的第一行给其后跟的变量<code>var</code>或<code>$0</code>（无变量），应该注意到，由于awk在处理getline之前已经读入了一行，所以getline得到的返回结果是隔行的。</li>
<li><strong>当其左右有重定向符<code>|</code>或<code>&lt;</code>时：</strong> getline则作用于定向输入文件，由于该文件是刚打开，并没有被awk读入一行，只是getline读入，那么getline返回的是该文件的第一行，而不是隔行。</li>
</ul>
<p><strong>示例：</strong> </p>
<p>执行linux的<code>date</code>命令，并通过管道输出给<code>getline</code>，然后再把输出赋值给自定义变量out，并打印它：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ "date" | getline out; print out }'</span> <span class="token function">test</span></code></pre>
<p>执行shell的date命令，并通过管道输出给getline，然后getline从管道中读取并将输入赋值给out，split函数把变量out转化成数组mon，然后打印数组mon的第二个元素：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }'</span> <span class="token function">test</span></code></pre>
<p>命令ls的输出传递给geline作为输入，循环使getline从ls的输出中读取一行，并把它打印到屏幕。这里没有输入文件，因为BEGIN块在打开输入文件前执行，所以可以忽略输入文件。</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ while( "ls" | getline) print }'</span></code></pre>
<h3 id="关闭文件">关闭文件</h3><p>awk中允许在程序中关闭一个输入或输出文件，方法是使用awk的close语句。</p>
<pre><code class="language-shell">close<span class="token punctuation">(</span><span class="token string">"filename"</span><span class="token punctuation">)</span></code></pre>
<p>filename可以是getline打开的文件，也可以是stdin，包含文件名的变量或者getline使用的确切命令。或一个输出文件，可以是stdout，包含文件名的变量或使用管道的确切命令。</p>
<h3 id="输出到一个文件">输出到一个文件</h3><p>awk中允许用如下方式将结果输出到一个文件：</p>
<pre><code class="language-shell"><span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{printf("hello word!n") > "datafile"}'</span>
<span class="token comment"># 或</span>
<span class="token keyword">echo</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{printf("hello word!n") >> "datafile"}'</span></code></pre>
<h2 id="设置字段定界符">设置字段定界符</h2><p>默认的字段定界符是空格，可以使用<code>-F &quot;定界符&quot;</code>  明确指定一个定界符：</p>
<pre><code class="language-shell"><span class="token function">awk</span> -F: <span class="token string">'{ print <span class="token variable">&#36;NF</span> }'</span> /etc/passwd
<span class="token comment"># 或</span>
<span class="token function">awk</span> <span class="token string">'BEGIN{ FS=":" } { print <span class="token variable">&#36;NF</span> }'</span> /etc/passwd</code></pre>
<p>在<code>BEGIN语句块</code>中则可以用<code>OFS=“定界符”</code>设置输出字段的定界符。</p>
<h2 id="流程控制语句">流程控制语句</h2><p>在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向，也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中，流程控制语句，语法结构，与c语言类型。有了这些语句，其实很多shell程序都可以交给awk，而且性能是非常快的。下面是各个语句用法。</p>
<h3 id="条件判断语句">条件判断语句</h3><pre><code class="language-shell">if<span class="token punctuation">(</span>表达式<span class="token punctuation">)</span>
  语句1
<span class="token keyword">else</span>
  语句2</code></pre>
<p>格式中语句1可以是多个语句，为了方便判断和阅读，最好将多个语句用{}括起来。awk分枝结构允许嵌套，其格式为：</p>
<pre><code class="language-shell">if<span class="token punctuation">(</span>表达式<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>语句1<span class="token punctuation">}</span>
<span class="token keyword">else</span> if<span class="token punctuation">(</span>表达式<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>语句2<span class="token punctuation">}</span>
<span class="token keyword">else</span>
  <span class="token punctuation">{</span>语句3<span class="token punctuation">}</span></code></pre>
<p>示例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
test=100;
if(test>90){
  print "very good";
  }
  else if(test>60){
    print "good";
  }
  else{
    print "no pass";
  }
}'</span>

very good</code></pre>
<p>每条命令语句后面可以用<code>;</code> <strong>分号</strong> 结尾。</p>
<h3 id="循环语句">循环语句</h3><h4 id="while语句">while语句</h4><pre><code class="language-shell">while<span class="token punctuation">(</span>表达式<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>语句<span class="token punctuation">}</span></code></pre>
<p>示例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
test=100;
total=0;
while(i&lt;=test){
  total+=i;
  i++;
}
print total;
}'</span>
5050</code></pre>
<h4 id="for循环">for循环</h4><p>for循环有两种格式：</p>
<p>格式1：</p>
<pre><code class="language-shell">for<span class="token punctuation">(</span>变量 <span class="token keyword">in</span> 数组<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>语句<span class="token punctuation">}</span></code></pre>
<p>示例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
for(k in ENVIRON){
  print k"="ENVIRON[k];
}

}'</span>
TERM<span class="token operator">=</span>linux
G_BROKEN_FILENAMES<span class="token operator">=</span>1
SHLVL<span class="token operator">=</span>1
pwd<span class="token operator">=</span>/root/text
<span class="token punctuation">..</span>.
logname<span class="token operator">=</span>root
HOME<span class="token operator">=</span>/root
SSH_CLIENT<span class="token operator">=</span>192.168.1.21 53087 22</code></pre>
<p>注：ENVIRON是awk常量，是子典型数组。</p>
<p>格式2：</p>
<pre><code class="language-shell">for<span class="token punctuation">(</span>变量<span class="token punctuation">;</span>条件<span class="token punctuation">;</span>表达式<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>语句<span class="token punctuation">}</span></code></pre>
<p>示例：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
total=0;
for(i=0;i&lt;=100;i++){
  total+=i;
}
print total;
}'</span>
5050</code></pre>
<h4 id="do循环">do循环</h4><pre><code class="language-shell"><span class="token keyword">do</span>
<span class="token punctuation">{</span>语句<span class="token punctuation">}</span> while<span class="token punctuation">(</span>条件<span class="token punctuation">)</span></code></pre>
<p>例子：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{ 
total=0;
i=0;
do {total+=i;i++;} while(i&lt;=100)
  print total;
}'</span>
5050</code></pre>
<h3 id="其他语句">其他语句</h3><ul>
<li><strong>break</strong>  当 break 语句用于 while 或 for 语句时，导致退出程序循环。</li>
<li><strong>continue</strong>  当 continue 语句用于 while 或 for 语句时，使程序循环移动到下一个迭代。</li>
<li><strong>next</strong>  能能够导致读入下一个输入行，并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。</li>
<li><strong>exit</strong>  语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则，或在END中应用exit语句，则终止脚本的执行。</li>
</ul>
<h2 id="数组应用">数组应用</h2><p>数组是awk的灵魂，处理文本中最不能少的就是它的数组处理。因为数组索引（下标）可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明，也不必声明大小。数组元素用0或空字符串来初始化，这根据上下文而定。</p>
<h3 id="数组的定义">数组的定义</h3><p>数字做数组索引（下标）：</p>
<pre><code class="language-shell">Array<span class="token punctuation">[</span>1<span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"sun"</span>
Array<span class="token punctuation">[</span>2<span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"kai"</span></code></pre>
<p>字符串做数组索引（下标）：</p>
<pre><code class="language-shell">Array<span class="token punctuation">[</span><span class="token string">"first"</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"www"</span>
Array<span class="token string">"[last"</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"name"</span>
Array<span class="token punctuation">[</span><span class="token string">"birth"</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string">"1987"</span></code></pre>
<p>使用中<code>print Array[1]</code>会打印出sun；使用<code>print Array[2]</code>会打印出kai；使用<code>print[&quot;birth&quot;]</code>会得到1987。</p>
<p> <strong>读取数组的值</strong> </p>
<pre><code class="language-shell"><span class="token punctuation">{</span> for<span class="token punctuation">(</span>item <span class="token keyword">in</span> array<span class="token punctuation">)</span> <span class="token punctuation">{</span>print array<span class="token punctuation">[</span>item<span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>       <span class="token comment">#输出的顺序是随机的</span>
<span class="token punctuation">{</span> for<span class="token punctuation">(</span>i<span class="token operator">=</span>1<span class="token punctuation">;</span>i<span class="token operator">&lt;=</span>len<span class="token punctuation">;</span>i++<span class="token punctuation">)</span> <span class="token punctuation">{</span>print array<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>         <span class="token comment">#Len是数组的长度</span></code></pre>
<h3 id="数组相关函数">数组相关函数</h3><p><strong>得到数组长度：</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'</span>
4 4</code></pre>
<p>length返回字符串以及数组长度，split进行分割字符串为数组，也会返回分割得到数组长度。</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'</span>
4</code></pre>
<p>asort对数组进行排序，返回数组长度。</p>
<p><strong>输出数组内容（无序，有序输出）：</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'</span>
4 <span class="token function">test</span>
1 it
2 is
3 a </code></pre>
<p><code>for…in</code>输出，因为数组是关联数组，默认是无序的。所以通过<code>for…in</code>得到是无序的数组。如果需要得到有序数组，需要通过下标获得。</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k&lt;=tlen;k++){print k,tA[k];}}'</span>
1 it
2 is
3 a
4 <span class="token function">test</span></code></pre>
<p>注意：数组下标是从1开始，与C数组不一样。</p>
<p><strong>判断键值存在以及删除键值：</strong> </p>
<pre><code class="language-shell"><span class="token comment"># 错误的判断方法：</span>
<span class="token function">awk</span> <span class="token string">'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}'</span> 
no found
a a1
b b1
c</code></pre>
<p>以上出现奇怪问题，<code>tB[“c”]</code>没有定义，但是循环时候，发现已经存在该键值，它的值为空，这里需要注意，awk数组是关联数组，只要通过数组引用它的key，就会自动创建改序列。</p>
<pre><code class="language-shell"><span class="token comment"># 正确判断方法：</span>
<span class="token function">awk</span> <span class="token string">'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'</span>  
a a1
b b1</code></pre>
<p><code>if(key in array)</code>通过这种方法判断数组中是否包含<code>key</code>键值。</p>
<pre><code class="language-shell"><span class="token comment">#删除键值：</span>
<span class="token function">awk</span> <span class="token string">'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'</span>                     
b b1</code></pre>
<p><code>delete array[key]</code>可以删除，对应数组<code>key</code>的，序列值。</p>
<h3 id="二维、多维数组使用">二维、多维数组使用</h3><p>awk的多维数组在本质上是一维数组，更确切一点，awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如，<code>array[2,4]=1</code>这样的访问是允许的。awk使用一个特殊的字符串<code>SUBSEP(�34)</code>作为分割字段，在上面的例子中，关联数组array存储的键值实际上是2�344。</p>
<p>类似一维数组的成员测试，多维数组可以使用<code>if ( (i,j) in array)</code>这样的语法，但是下标必须放置在圆括号中。类似一维数组的循环访问，多维数组使用<code>for ( item in array )</code>这样的语法遍历数组。与一维数组不同的是，多维数组必须使用<code>split()</code>函数来访问单独的下标分量。</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
for(i=1;i&lt;=9;i++){
  for(j=1;j&lt;=9;j++){
    tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];
  }
}
}'</span>
1 * 1 <span class="token operator">=</span> 1
1 * 2 <span class="token operator">=</span> 2
1 * 3 <span class="token operator">=</span> 3
1 * 4 <span class="token operator">=</span> 4
1 * 5 <span class="token operator">=</span> 5
1 * 6 <span class="token operator">=</span> 6 
<span class="token punctuation">..</span>.
9 * 6 <span class="token operator">=</span> 54
9 * 7 <span class="token operator">=</span> 63
9 * 8 <span class="token operator">=</span> 72
9 * 9 <span class="token operator">=</span> 81</code></pre>
<p>可以通过<code>array[k,k2]</code>引用获得数组内容。</p>
<p>另一种方法：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{
for(i=1;i&lt;=9;i++){
  for(j=1;j&lt;=9;j++){
    tarr[i,j]=i*j;
  }
}
for(m in tarr){
  split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m];
}
}'</span></code></pre>
<h2 id="内置函数">内置函数</h2><p>awk内置函数，主要分以下3种类似：算数函数、字符串函数、其它一般函数、时间函数。</p>
<h3 id="算术函数">算术函数</h3><table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>atan2( y, x )</td>
<td>返回 y/x 的反正切。</td>
</tr>
<tr>
<td>cos( x )</td>
<td>返回 x 的余弦；x 是弧度。</td>
</tr>
<tr>
<td>sin( x )</td>
<td>返回 x 的正弦；x 是弧度。</td>
</tr>
<tr>
<td>exp( x )</td>
<td>返回 x 幂函数。</td>
</tr>
<tr>
<td>log( x )</td>
<td>返回 x 的自然对数。</td>
</tr>
<tr>
<td>sqrt( x )</td>
<td>返回 x 平方根。</td>
</tr>
<tr>
<td>int( x )</td>
<td>返回 x 的截断至整数的值。</td>
</tr>
<tr>
<td>rand( )</td>
<td>返回任意数字 n，其中 0 &lt;= n &lt; 1。</td>
</tr>
<tr>
<td>srand( [expr] )</td>
<td>将 rand 函数的种子值设置为 Expr 参数的值，或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。</td>
</tr>
</tbody></table>
<p>举例说明：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'</span>
0.841 22026.466 2.303 3
</code></pre>
<p>OFMT 设置输出数据格式是保留3位小数。</p>
<p>获得随机数：</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{srand();fr=int(100*rand());print fr;}'</span>
78
<span class="token function">awk</span> <span class="token string">'BEGIN{srand();fr=int(100*rand());print fr;}'</span>
31
<span class="token function">awk</span> <span class="token string">'BEGIN{srand();fr=int(100*rand());print fr;}'</span>
41 </code></pre>
<h3 id="字符串函数">字符串函数</h3><table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>gsub( Ere, Repl, [ In ] )</td>
<td>除了正则表达式所有具体值被替代这点，它和 sub 函数完全一样地执行。</td>
</tr>
<tr>
<td>sub( Ere, Repl, [ In ] )</td>
<td>用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &amp;（和符号）由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数，缺省值是整个记录（$0 记录变量）。</td>
</tr>
<tr>
<td>index( String1, String2 )</td>
<td>在由 String1 参数指定的字符串（其中有出现 String2 指定的参数）中，返回位置，从 1 开始编号。如果 String2 参数不在 String1 参数中出现，则返回 0（零）。</td>
</tr>
<tr>
<td>length [(String)]</td>
<td>返回 String 参数指定的字符串的长度（字符形式）。如果未给出 String 参数，则返回整个记录的长度（$0 记录变量）。</td>
</tr>
<tr>
<td>blength [(String)]</td>
<td>返回 String 参数指定的字符串的长度（以字节为单位）。如果未给出 String 参数，则返回整个记录的长度（$0 记录变量）。</td>
</tr>
<tr>
<td>substr( String, M, [ N ] )</td>
<td>返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得，其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数，则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。</td>
</tr>
<tr>
<td>match( String, Ere )</td>
<td>在 String 参数指定的字符串（Ere 参数指定的扩展正则表达式出现在其中）中返回位置（字符形式），从 1 开始编号，或如果 Ere 参数不出现，则返回 0（零）。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度，或如果未找到任何匹配，则设置为 -1（负一）。</td>
</tr>
<tr>
<td>split( String, A, [Ere] )</td>
<td>将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n]，并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行，或用当前字段分隔符（FS 特殊变量）来进行（如果没有给出 Ere 参数）。除非上下文指明特定的元素还应具有一个数字值，否则 A 数组中的元素用字符串值来创建。</td>
</tr>
<tr>
<td>tolower( String )</td>
<td>返回 String 参数指定的字符串，字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。</td>
</tr>
<tr>
<td>toupper( String )</td>
<td>返回 String 参数指定的字符串，字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。</td>
</tr>
<tr>
<td>sprintf(Format, Expr, Expr, . . . )</td>
<td>根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。</td>
</tr>
</tbody></table>
<p>注：Ere都可以是正则表达式。</p>
<p><strong>gsub,sub使用</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'</span>
this is a test<span class="token operator">!</span>test<span class="token operator">!</span></code></pre>
<p>在 info中查找满足正则表达式，<code>/[0-9]+/</code> 用<code>””</code>替换，并且替换后的值，赋值给info 未给info值，默认是<code>$0</code></p>
<p> <strong>查找字符串（index使用）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'</span>
ok</code></pre>
<p>未找到，返回0</p>
<p><strong>正则表达式匹配查找(match使用）</strong> </p>
<pre><code><span class="token function">awk</span> <span class="token string">'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'</span>
ok</code></pre><p><strong>截取字符串(substr使用）</strong> </p>
<pre><code class="language-shell"><span class="token punctuation">[</span>wangsl@centos5 ~<span class="token punctuation">]</span>&#36; <span class="token function">awk</span> <span class="token string">'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'</span>
s is a tes</code></pre>
<p>从第 4个 字符开始，截取10个长度字符串</p>
<p><strong>字符串分割（split使用）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'</span>
4
4 <span class="token function">test</span>
1 this
2 is
3 a</code></pre>
<p>分割info，动态创建数组tA，这里比较有意思，<code>awk for …in</code>循环，是一个无序的循环。 并不是从数组下标1…n ，因此使用时候需要注意。</p>
<p><strong>格式化字符串输出（sprintf使用）</strong> </p>
<p>格式化字符串格式：</p>
<p>其中格式化字符串包括两部分内容：一部分是正常字符，这些字符将按原样输出; 另一部分是格式化规定字符，以<code>&quot;%&quot;</code>开始，后跟一个或几个规定字符,用来确定输出内容格式。</p>
<table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>%d</td>
<td>十进制有符号整数</td>
<td>%u</td>
<td>十进制无符号整数</td>
</tr>
<tr>
<td>%f</td>
<td>浮点数</td>
<td>%s</td>
<td>字符串</td>
</tr>
<tr>
<td>%c</td>
<td>单个字符</td>
<td>%p</td>
<td>指针的值</td>
</tr>
<tr>
<td>%e</td>
<td>指数形式的浮点数</td>
<td>%x</td>
<td>%X 无符号以十六进制表示的整数</td>
</tr>
<tr>
<td>%o</td>
<td>无符号以八进制表示的整数</td>
<td>%g</td>
<td>自动选择合适的表示法</td>
</tr>
</tbody></table>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}'</span>
124.11,18446744073709551615,1.2,7C,174</code></pre>
<h3 id="一般函数">一般函数</h3><table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>close( Expression )</td>
<td>用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭，则返回 0；其它情况下返回非零值。如果打算写一个文件，并稍后在同一个程序中读取文件，则 close 语句是必需的。</td>
</tr>
<tr>
<td>system(command )</td>
<td>执行 Command 参数指定的命令，并返回退出状态。等同于 system 子例程。</td>
</tr>
<tr>
<td>Expression <code>|</code> getline [ Variable ]</td>
<td>从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录，并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流，则创建流。创建的流等同于调用 popen 子例程，此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串，则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数，则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。</td>
</tr>
<tr>
<td>getline [ Variable ] &lt; Expression</td>
<td>从 Expression 参数指定的文件读取输入的下一个记录，并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值，则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数，则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。</td>
</tr>
<tr>
<td>getline [ Variable ]</td>
<td>将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数，则 $0 记录变量设置为该记录的值，还将设置 NF、NR 和 FNR 特殊变量。</td>
</tr>
</tbody></table>
<p><strong>打开外部文件（close用法）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{while("cat /etc/passwd"|getline){print <span class="token variable">&#36;0</span>;};close("/etc/passwd");}'</span>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre>
<p><strong>逐行读取外部文件(getline使用方法）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{while(getline &lt; "/etc/passwd"){print <span class="token variable">&#36;0</span>;};close("/etc/passwd");}'</span>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin</code></pre>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{print "Enter your name:";getline name;print name;}'</span>
Enter your name:
chengmo
chengmo</code></pre>
<p><strong>调用外部应用程序(system使用方法）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{b=system("ls -al");print b;}'</span>
total 42092
drwxr-xr-x 14 chengmo chengmo     4096 09-30 17:47 <span class="token keyword">.</span>
drwxr-xr-x 95 root   root       4096 10-08 14:01 <span class="token punctuation">..</span></code></pre>
<p>b返回值，是执行结果。</p>
<h3 id="时间函数">时间函数</h3><table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>函数名</td>
<td>说明</td>
</tr>
<tr>
<td>mktime( YYYY MM dd HH MM ss[ DST])</td>
<td>生成时间格式</td>
</tr>
<tr>
<td>strftime([format [, timestamp]])</td>
<td>格式化时间输出，将时间戳转为时间字符串具体格式，见下表。</td>
</tr>
<tr>
<td>systime()</td>
<td>得到时间戳，返回从1970年1月1日开始到当前时间(不计闰年)的整秒数</td>
</tr>
</tbody></table>
<p><strong>建指定时间(mktime使用）</strong> </p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'</span>
2001年01月01日 星期一 12时12分12秒</code></pre>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}'</span>
2634468</code></pre>
<p>求2个时间段中间时间差，介绍了strftime使用方法</p>
<pre><code class="language-shell"><span class="token function">awk</span> <span class="token string">'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}'</span> 
308201392</code></pre>
<p><strong>strftime日期和时间格式说明符</strong> </p>
<table>
<thead>
<tr>
<th>格式</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>%a</td>
<td>星期几的缩写(Sun)</td>
</tr>
<tr>
<td>%A</td>
<td>星期几的完整写法(Sunday)</td>
</tr>
<tr>
<td>%b</td>
<td>月名的缩写(Oct)</td>
</tr>
<tr>
<td>%B</td>
<td>月名的完整写法(October)</td>
</tr>
<tr>
<td>%c</td>
<td>本地日期和时间</td>
</tr>
<tr>
<td>%d</td>
<td>十进制日期</td>
</tr>
<tr>
<td>%D</td>
<td>日期 08/20/99</td>
</tr>
<tr>
<td>%e</td>
<td>日期，如果只有一位会补上一个空格</td>
</tr>
<tr>
<td>%H</td>
<td>用十进制表示24小时格式的小时</td>
</tr>
<tr>
<td>%I</td>
<td>用十进制表示12小时格式的小时</td>
</tr>
<tr>
<td>%j</td>
<td>从1月1日起一年中的第几天</td>
</tr>
<tr>
<td>%m</td>
<td>十进制表示的月份</td>
</tr>
<tr>
<td>%M</td>
<td>十进制表示的分钟</td>
</tr>
<tr>
<td>%p</td>
<td>12小时表示法(AM/PM)</td>
</tr>
<tr>
<td>%S</td>
<td>十进制表示的秒</td>
</tr>
<tr>
<td>%U</td>
<td>十进制表示的一年中的第几个星期(星期天作为一个星期的开始)</td>
</tr>
<tr>
<td>%w</td>
<td>十进制表示的星期几(星期天是0)</td>
</tr>
<tr>
<td>%W</td>
<td>十进制表示的一年中的第几个星期(星期一作为一个星期的开始)</td>
</tr>
<tr>
<td>%x</td>
<td>重新设置本地日期(08/20/99)</td>
</tr>
<tr>
<td>%X</td>
<td>重新设置本地时间(12:00:00)</td>
</tr>
<tr>
<td>%y</td>
<td>两位数字表示的年(99)</td>
</tr>
<tr>
<td>%Y</td>
<td>当前月份</td>
</tr>
<tr>
<td>%%</td>
<td>百分号(%)</td>
</tr>
</tbody></table>
<!-- Linux命令行搜索引擎：https://jaywcjlove.github.io/linux-command/ -->

</div>

<div class="footer ">
  <a target="_blank" href="https://github.com/jaywcjlove/linux-command/new/master/command">添加命令</a> |
  <a href="../hot.html">命令列表</a> |
  <a href="https://github.com/jaywcjlove/oscnews">Chrome 插件</a> |
  <a href="https://github.com/jaywcjlove/linux-command/releases">Alfred</a> |
  <a href="https://github.com/roachsinai/krunner-linuxcommands">Krunner</a> |
  <a href="http://jaywcjlove.gitee.io/linux-command/">开源中国Web版</a>
  <br />
  <a href="https://github.com/jaywcjlove/linux-command">Github</a> |
  <a href="https://jaywcjlove.github.io/linux-command/">短地址：https://git.io/linux</a>
  <br />
  收藏本站请使用Ctrl+D或者Command+d
  <br /> 共搜集到
  <span id="commands_info">
    556
  </span> 个Linux命令
</div>
<script>
var _hmt = _hmt || []; (function() {var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?a542c0213a9aa8ae29fccdc8a18b91ef"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
<script type="text/javascript" src="../js/dt.js?v=1559033627836"></script>
<script type="text/javascript" src="../js/index.js?v=1559033627836"></script>
</body>
</html>